<?php
/**
 * Склоняет слово, в зависимости от числа. Работает с двухзначными числами.
 *
 * @param int $num - число
 * @param array $words - массив с вариантами склонений
 * @return string
 */
function rusInducing($num, $words)
{
	$out = "";
	if (strlen($num)==2) // Если число двухзначное
	{
		if (substr($num, 0, 1)!='1') // Если не начинается с единицы
		{
			switch(substr($num, 1, 1))
			{
				case 1:
					$out = $words[0]; // правка
					break;
				case 2:
				case 3:
				case 4:
					$out = $words[1]; // правки
					break;
				case 5:
				case 6:
				case 7:
				case 8:
				case 9:
				case 0:
					$out = $words[2];  // правок
					break;
			}
		}
		else // Если начинается с единицы
		{
			$out = $words[2];
		}		
	}
	else // Если число состоит из одного знака
	{
		switch ($num)
		{
			case 1:
				$out = $words[0];
				break;
			case 2:
			case 3:
			case 4:
				$out = $words[1];
				break;
			case 5:
			case 7:
			case 8:
			case 9:
			case 0:
				$out = $words[2];
				break;
		}
	}
	return $out;
}

/**
 * Англо-русский словарь. Возвращает многомерный массив с вариантами перевода и частью речи
 *
 * @param string $text - текст для перевода
 * @param string $from - исходный язык
 * @param string $to - язык перевода
 * @return array
 */
function dict($text, $from, $to)
{
	$out = array();
	
	$langs = urlencode($from.'|'.$to);
	$txt   = urlencode($text);
	$url   = 'http://www.google.com/dictionary?langpair='.$langs.'&q='.$txt.'&hl=ru'; // Формирование строки запроса
	
	$str = file_get_html($url); // Получение содержимого из указанного url
	$html = $str->find('div[class=err]'); // Поиск дива с сообщением об ошибке
	if (count($html) !== 0) // Если див найден
	{
		return false;
	}
	else 
	{
		foreach ($str->find('ul[class=dfnt] h4') as $element) // Нахождение части речи
		{
			$that = str_replace("\n", '', $element->plaintext);
			$out['type'][] = $that; // Записи части речи в очередной элемент массива
		}
		foreach ($str->find('ul[class=dfnt] li ol') as $element) // Нахождение перевода
		{
			$txt = '';
			foreach ($element->find('li span[class=mn]') as $el)
			{
				$that = str_replace("\n", '', $el->plaintext);
				$txt .= $that.', '; // Запись перевода в очередной элемент массива
			}
			$txt = substr($txt, 0, -2);
			$out['translate'][] = $txt;
		}
		$str->clear();
		return $out;
	}
}

/**
 * Переводит текст, используя API google translate. Подходит лишь для небольшого количества текста.
 *
 * @param string $text - исходный текст
 * @param string $from_lang - исходный язык
 * @param string $to_lang - язык для перевода
 * @return string
 */
function translate($text, $from_lang, $to_lang)
{
	$q_str = urlencode($text);
	$langs_str = urlencode($from_lang.'|'.$to_lang);
	
	$url  = 'http://ajax.googleapis.com/ajax/services/language/translate?v=1.0';
	$url .= '&q='.$q_str;
	$url .= '&amp;&langpair='.$langs_str;
	
	$result = file_get_contents($url);
	$arr = json_decode($result, true);
	
	if ($arr == false || $arr['responseStatus'] != 200)
	{
		return false;
	}
	else 
	{
		return $arr['responseData']['translatedText'];
	}
}

/**
 * Переводит текст с русского на английский используя google translate. Работает по методу POST, поэтому может переводить
 * большой обьем текста.
 *
 * @param string $text
 * @return string
 */
function postTranslate($text)
{
	$post = 'hl=ru&js=n&prev=hp&sl=en&text='.$text;
	$ch = curl_init('http://translate.google.com/translate_t#');
	curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
	curl_setopt($ch, CURLOPT_POST, true);
	curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
	curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.7) Gecko/2009021910 Firefox/3.0.7 (.NET CLR 3.5.30729)');
	curl_setopt($ch, CURLOPT_REFERER, 'http://translate.google.com/');
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
	$res = curl_exec($ch);
	$html = str_get_html($res);
	$str = $html->find('div#result_box', 0);
	$itog = explode('. ',  $str->innertext);
	return $itog;
}

/**
 * Проверяет строку на цифровое значение
 *
 * @param string $input
 * @return boolean
 */
function check_int($input)
{
	$check = preg_match("/[^0-9]+/i", $input);
	if ($check !== 0)
	{
		return false;
	}
	return true;
}
/**
 * Переводит байты в килобайты с округлением в большую сторону
 *
 * @param int $input
 * @return float
 */
function bytes2kb($input)
{
	return round(($input/1024), 2);
}
 
/**
 * Вызывает переход на предыдущую страницу с указанием ошибки
 *
 * @param string $type - тип ошибки
 * @param string $text - текст сообщения об ошибке
 */
function goBack($type, $text=null)
{
	$back = $_SERVER['HTTP_REFERER'];
	$_SESSION['error'] = $type;
	$_SESSION['text'] = $text;
	header("Location: ".$back);
	die();
}

/**
 * Создает sql запрос для записи новых слов в базу данных
 *
 * @param array $arr - массив со словами
 * @return string
 */
function insertNewWords($arr)
{
	$ins_str = 'INSERT `eng_words` (`id`, `name`, `translate`) VALUES '; // Начало строки запроса
	$i = 0;

	$words = implode('. ', $arr); // Перевод элементов массива в одну строку с точками-разделителями.
	$trans = postTranslate($words); // Перевод всего текста
	
	foreach ($arr as $key=>$value) // Формируем запрос на добавление информации
	{
		$val = mysql_real_escape_string($value);
		$translate = ($trans[$i] == $val) ? '' : $trans[$i];
		$ins_str .= '(null, \''.$val.'\', \''.$trans[$i].'\'), ';
		$i++;
	}
	$ins_str = substr($ins_str, 0, -2); // Обрезаем строку, чтобы не было ошибок
	return $ins_str;
}

/**
 * Показывает прошедшее время в человеческом формате
 *
 * @param int $timestamp - прошедшее время в секундах
 * @return string
 */
function numeralDate($timestamp)
{
	switch ($timestamp)
	{
		case ($timestamp<61): // Время в секундах
			$words = array('секунда', 'секунды', 'секунд');
			$time = $timestamp;
			break;
		case ($timestamp>60 && $timestamp<3601): // Время в минутах
			$words = array('минута', 'минуты', 'минут');
			$time = floor($timestamp/60);
			break;
		case ($timestamp>3600 && $timestamp<86401): // Время в часах
			$words = array('час', 'часа', 'часов');
			$time = floor($timestamp/3600);
			break;
		case ($timestamp>86401): // Время в сутках
			$words = array('сутки', 'суток', 'суток');
			$time = floor($timestamp/86400);
			break;
	}
	$out[] = $time;
	$out[] = rusInducing($time, $words);
	return $out;
}

/**
 * Обрезает строку до указанной длины и экранирует html-символы
 *
 * @param stirng $input - Исходная строка
 * @param int $len - Длина строки
 * @return string
 */
function cutAndSafe($input, $len)
{
	$out = htmlspecialchars($input);
	if (strlen($input) > $len)
	{
		$out = substr($out, 0, $len).'&#8230;';
	}
	return $out;
}

/**
 * Находит в тексте содержимое тега title и возвращет его в безопасном виде
 *
 * @param string $content - содержимое страницы
 * @return string
 */
function getPageTitle($content)
{
	preg_match('|<title>(.*)</title>|mi', $content, $out);
	$result = trim(htmlspecialchars($out[1]));
	return $result;
}

/**
 * Создает из ключей исходного массива новый одномерный массив
 *
 * @param array $old_array - исходный массив
 * @return array
 */
function newArray($old_array)
{
	$new = array();
	foreach ($old_array as $key=>$val)
	{
		$new[] = $key;
	}
	return $new;
}

/**
 * Конвертирует html документ в чистый текст
 *
 * @param string $html
 * @return string
 */
function removeChars($html)
{
	$patt = '/(&[a-z]+;)/i';
	$result = preg_replace($patt, '', $html);
	return $result;
}

/**
 * Формирует запрос на добавление в базу данных информации о соответствии
 * слов и их количестве
 *
 * @param array $arr - массив с информацией
 * @param int $url_id - id страницы
 * @return string
 */
function insertAssignWords($arr, $url_id)
{
	$ins_str = 'INSERT `eng_assign` (`word_id`, `url_id`, `count`) VALUES ';
	foreach ($arr as $key=>$value) 
	{
		$ins_str .= '('.$key.', '.$url_id.', '.$value.'), ';
	}
	$ins_str = substr($ins_str, 0, -2);
	return $ins_str;
}

/**
 * Подсчитывает общую длину в символах всех элементов массива
 *
 * @param array $arr - исходный массив
 * @return int
 */
function arraySize($arr)
{
	$len = 0;
	foreach ($arr as $val)
	{
		$len += strlen($val);
	}
	return $len;
}

/**
 * Удаляет из массива все элементы с нулевым значением
 *
 * @param array $arr - исходный массив
 * @return array
 */
function clearArray($arr)
{
	foreach ($arr as $key=>$val)
	{
		if ($val === 0)
		{
			unset($arr[$key]);
		}
	}
	return $arr;
}

/**
 * Проверяет по словарю значения массива POST на соответствие числовым значениям
 *
 * @param array $dict - словарь с названиями элементов поста
 * @return bool
 */
function postValid($dict)
{
	foreach ($_POST as $key=>$value)
	{
		if (in_array($key, $dict))
		{
			if (check_int($value) == false)
			{
				return false;
			}
		}
	}
}
?>